// 不可复制的类型
struct Empty;
struct Null;

// doubleDrop drop 实例本身和 T
trait DoubleDrop<T> {
    fn double_drop(self, _: T);
}

// 实现 DoubleDrop
impl<T, U> DoubleDrop<T> for U {
    // 获得两个参数的所有权, 并释放
    fn double_drop(self, _: T) {}
}

fn main() {
    println!("泛型 trait");

    let empty = Empty;
    let null = Null;

    empty.double_drop(null);

    // 所有权已释放
    // empty; // use of moved value: `empty`
    // null;
}
